/**
 *Copyright (c) 2017- https://gitee.com/allmx/master.git
 * hhqk-lmx:下午3:41:56
 */
package org.hhqk.admin.common.log4j;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.sun.tools.internal.xjc.reader.xmlschema.bindinfo.BIConversion.User;

/**
 * @author Administrator SystemAopLog4j.java 2017年11月15日
 *         <p>
 * 		description:作为使用注解的形式给SystemAopLog4j类定义切面，切点等类型，log4j aop
 *         </p>
 */
@Aspect
@Component
public class SystemAopLog4j {

	private static final Logger logger = Logger.getLogger(SystemAopLog4j.class);

	/*
	 * 定义切点 的 包/类
	 */
	@Pointcut("execution(* org.hhqk.admin.common.dao..*.*(..))")
	public void aopLog4j() {

	}

	/*
	 * 定义切点 的 包/类 controller 层切点
	 * 
	 * 是否需要把这个路径做到配置文件中
	 */
	@Pointcut("execution(* org.hhqk.admin.controller..*.*(..))")
	public void controllerAspect() {

	}

	/*
	 * 定义切点 的 包/类 service 层切点
	 */
	@Pointcut("execution(* org.hhqk.admin.common.service..*.*(..)) or execution(* org.hhqk.admin.service.impl..*.*(..))")
	public void serviceAspect() {

	}

	/*
	 * 前置通知，用于拦截controller层方法 记录用户的操作 时间 ip 用户 操作了哪个类，为不同用户记录不同的日志文件
	 */
	@Before("controllerAspect()")
	public void before(JoinPoint joinPoint) {
		// 拿到session里的user
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
				.getRequest();
//		HttpSession session = request.getSession();
//		User user = (User) session.getAttribute("userName");
		// 拿到登录的ip
		String ip = request.getRemoteAddr();
		// 请求方法
		String method = joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()";
		// 请求描述，需要自定义注解，然后去获取自定义注解里的描述信息
		System.err.println("controller before UserName:后期待处理;ip:" + ip + ";method:" + method);
		// 记录在日志文件中

		// 加载在数据库中
	}

	/*
	 * 异常通知，用于拦截service层方法 记录异常日志     Throwable改成自定义的异常
	 */
	@AfterThrowing(pointcut = "serviceAspect()", throwing = "e")
	public void afterThrowing(JoinPoint joinPoint, Throwable e) {
		// 拿到session里的user
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
				.getRequest();
		HttpSession session = request.getSession();
		User user = (User) session.getAttribute("userName");
		// 拿到登录的ip
		String ip = request.getRemoteAddr();
		// 异常方法
		String method = joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()";
		// 请求参数，参数是对象的处理待实现
		String params = "";
//		if (joinPoint.getArgs() != null && joinPoint.getArgs().length > 0) {
//			for (int i = 0; i < joinPoint.getArgs().length; i++) {
//				params += JSONUtils.toJSONString(joinPoint.getArgs()[i]) + ";";
//			}
//		}
		// 异常信息
		String message = e.getMessage();
		System.err.println("service afterThrowing UserName:后期待处理;ip:" + ip + ";method:" + method+";params:"+params+";message:"+message);
	}

	/*
	 * 获取controller层 方法 中 自定义注解的信息
	 */

	/*
	 * 获取service层 方法 中 自定义注解的信息
	 */
}
